class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getattribute__(self, item):
        """
        属性被调用时，自动调用
        :param item:
        :return:
        """
        print("当前被调用的属性是：", item)
        return super().__getattribute__(item)
        # 不能写 return self.xxxx
        # 会造成死循环，因为这个调用会再次访问getattribute

    def __getattr__(self, item):
        """
        属性不存在 且 getattribute没处理该异常时，自动调用当前方法
        :param item:
        :return:
        """
        print(f"__getattr__方法被调用: {item}")

    def __setattr__(self, key, value):
        """
        设置属性时，自动调用
        :param key:
        :param value:
        :return:
        """
        print(f"设置了属性{key}={value}")
        if key == "age":
            if value < 18:
                raise ValueError("年龄不能小于18")
        self.__dict__[key] = value  # 设置属性（原本的逻辑）

    


s = Student("张三", 19)
s.gender = "male"
print(s.name)
print(s.age)
